package image;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

/**
 * Speichert im Arbeitsspeicher Bilder und verkleinert diese.
 * @author Dennis Wittkoetter
 *
 */
public class ImgManipulator {
	/**Beinhaltet das gelesene Bild*/
	Image img;
	/**Beinhaltet das verkleinerte Bild fuer die Vorschau im Programm*/
	BufferedImage thumbnail;
	/**Beinhaltet das verkleinerte Bild fuer die normale Anzeige im Programm*/
	BufferedImage smallImg;
	
	/**
	 * Konstruiert den Image-Manipulator
	 */
	public ImgManipulator() {
		img = null;
		thumbnail = null;
		smallImg = null;
	}
	
	/**
	 * Skaliert ein Bild
	 * @param path	Pfad zum zu verkleinernden Bild
	 * @throws IOException
	 */
	public ImgManipulator(String path) throws IOException {
		img = new ImageIcon(ImageIO.read(new File(path))).getImage();
		thumbnail = resizeImageByHeight(75);
		smallImg = resizeImageByHeight(145);
	}
	
	/**
	 * Skaliert ein Bild
	 * @param file	zu verkleinernde Bilddatei
	 * @throws IOException
	 */
	public ImgManipulator(File file) throws IOException {
		img = new ImageIcon(ImageIO.read(file)).getImage();
		thumbnail = resizeImageByHeight(75);
		smallImg = resizeImageByHeight(145);
	}
	
	/**
	 * Skaliert ein Bild
	 * @param file	Image-Objekt des zu skalierenden Bildes
	 * @throws IOException
	 */
	public ImgManipulator(Image file) throws IOException {
		img = file;
		thumbnail = resizeImageByHeight(75);
		smallImg = resizeImageByHeight(145);
	}
	
	/**
	 * Skaliert das Bild auf die angegebenen Bildzeilenanzahl
	 * @param newHeight	neue Bildzeilenanzahl der Ausgabe-Images
	 * @return	skaliertes Image-Objekt
	 * @throws IOException
	 */
	private BufferedImage resizeImageByHeight(int newHeight) throws IOException {
		int width = img.getWidth(null);
		int height = img.getHeight(null);
		double ratio = ((double) width) / ((double) height);
		int newWidth = (int) (newHeight * ratio);
		Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
        BufferedImage outImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        Graphics g = outImg.getGraphics();
        g.drawImage(scaledImage, 0, 0, null);
        g.dispose();
        return outImg;
	}
	
	/**
	 * Schreibt ein skaliertes Bild als Thumbnail auf die Festplatte
	 * @param path	Pfad zur Bildausgabe
	 * @throws IOException
	 */
	public void writeThumbnail(String path) throws IOException {
		 ImageIO.write(thumbnail, "jpeg", new File(path));
	}
	
	/**
	 * Schreibt das verkleinerte Bild auf die Festplatte
	 * @param path	Pfad zur Bildausgabe
	 * @throws IOException
	 */
	public void writeSmallImg(String path) throws IOException {
		 ImageIO.write(smallImg, "jpeg", new File(path));
	}
	
	/**
	 * Liefert das Thumbnail als Image-Objekt
	 * @return	Thumbnail
	 */
	public Image getThumbAsImage() {
		return Toolkit.getDefaultToolkit().createImage(thumbnail.getSource());
	}
	
	/**
	 * Liefert das skalierte Bild als Image-Objekt
	 * @return	skaliertes Bild
	 */
	public Image getSmallImgAsImage() {
		return Toolkit.getDefaultToolkit().createImage(smallImg.getSource());
	}
	
	/**
	 * Liefert das eingegebene Bild als Image
	 * @return	Eingabebild
	 */
	public Image getAsImage() {
		return Toolkit.getDefaultToolkit().createImage(img.getSource());
	}
}
